<?php

class Commentaire
{
    private $commentaires;

    function __construct( $config = array() )
    {
        foreach( $config as $key => $value )
        $this->{$key} = property_exists( get_class($this), $key) ? $value : null;  
    }

    /**
    * 
    * [getList description]
    * @param  [type] $fileName [description]
    * @return array Retourne un array contenant les informations des commentaires
    */
    private function getList($filePath)
    {
        $document = new DOMDocument;
        $document->load($filePath);
 
        $bieresDom = $document->getElementsByTagName('biere');

        // Tableau associatif
        // clé : idBiere
        // valeur : array des notes de la biere
        $liste = array();
        foreach( $bieresDom as $biereDom )
        {
          $commentaires = array();
          $commentairesDom = $biereDom->getElementsByTagName('commentaire');
          foreach ($commentairesDom as $key => $commentaireDom) {
            array_push($commentaires, array('user' => $commentaireDom->getAttribute('user'), 'commentaire' => $commentaireDom->nodeValue, 'date' => $commentaireDom->getAttribute('date')));
          }
          $liste[$biereDom->getAttribute('id')] = $commentaires;
        }

        return $liste;
      }

      function save( $filePath )
      {
        $xml = new DOMDocument( "1.0", "UTF-8" );
        $xml->preserveWhiteSpace = true;
        $xml->formatOutput = true;


        $bieresDom = $xml->createElement( "bieres" );

        foreach ($this->getCommentaires() as $idBiere => $commentaires) 
        {
          $biereDom = $xml->createElement( "biere" );
          $biereDom->setAttribute('id', $idBiere);

          $commentairesDom = $xml->createElement( "commentaires" );

          foreach ($commentaires as $commentaire) 
          {
            $commentaireDom = $xml->createElement( "commentaire" );
            $commentaireDom->setAttribute('user', $commentaire['user']);
            $commentaireDom->setAttribute('date', $commentaire['date']);
            $commentaireDom->nodeValue = $commentaire['commentaire'];
            $commentairesDom->appendChild($commentaireDom);
          }

          $biereDom->appendChild($commentairesDom);
          $bieresDom->appendChild($biereDom);
        }

        $xml->appendChild($bieresDom);

        $xml->save($filePath);
      }

      function addCommentaire($idBiere, $user, $commentaire)
      {
        $liste = $this->getCommentaires();
        if(isset($liste[$idBiere]) && is_array($liste[$idBiere]))
          array_push($liste[$idBiere], array('user' => $user, 'commentaire' => $commentaire, "date" => time()));
        else
          $liste[$idBiere] = array(array('user' => $user, 'commentaire' => $commentaire, "date" => time()));
        $this->commentaires = $liste;
      }

      function getCommentaires()
      {
        if(!isset($this->commentaires))
          $this->commentaires = $this->getList(Config::$urlCommentaires);
        return $this->commentaires;
      }

      /**
      * Retourne l'objet si l'élément $attribut == $valeur est présent dans $liste
      * Retourne null si l'objet n'est pas présent
      * @param  [type] $listeDegres [description]
      * @param  [type] $attribute   [description]
      * @param  [type] $value       [description]
      * @return [type]              [description]
      */
      static function getByAttribute( $liste, $attribut, $valeur)
      {
        foreach ($liste as $key => $degre) {
          if($degre->get($attribut) == $valeur)
            return $degre;
        }
        return null;
      }

      public function get( $key )
      {
        // print_r($this);
        if ( property_exists( get_class($this), $key ) )
          return $this->{$key};
        else
          return null;
      }
      public function __set( $key, $value )
      {
        if ( property_exists( get_class($this), $key ) )
          $this->{$key} = $value;
      }
}

?>